<?php
namespace Monkey;

use \Monkey\Database;

/**
 * 数据层管理器\Monkey\DatabaseManager
 * @package    Monkey
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\DatabaseManager.php 版本号 2013-03-30 $
 */
final class DatabaseManager
{
    private $_activeKey; //当前连接Key
    private $_activeLink; //当前连接参数
    /**
     * @var \Monkey\Database\Driver\_Interface
     */
    private $_driver; //当前连接生成的数据驱动。
    /**
     * @var \Monkey\Database\QueryHelper\_Interface
     */
    private $_queryHelper;
    /**
     * @var \Monkey\Database\SqlHelper\Insert
     */
    private $_insert;
    /**
     * @var \Monkey\Database\SqlHelper\Select
     */
    private $_select;
    /**
     * @var \Monkey\Database\SqlHelper\Update
     */
    private $_update;
    /**
     * @var \Monkey\Database\SqlHelper\Delete
     */
    private $_delete;
    /**
     * 构造方法
     * @param string|integer $defaultKey 默认使用的连接池键名
     */
    public function __construct($defaultKey){
        $this->activeLink($defaultKey);
    }
    /**
     * 获取连接管理器对象
     * @return \Monkey\Database\LinkManager
     */
    public function &linkManager(){
        return Database\LinkManager::_instance();
    }
    /**
     * 设置活动连接
     * @param string|integer $key 连接池的键名
     * @return bool
     */
    public function activeLink($key){
        $linker=Database\LinkManager::_instance();
        if(!$linker->existKey($key))return false;
        $this->_activeKey=$key;
        $this->_activeLink=$linker->getLink($key);
        if($this->_driver instanceof Database\Driver\_Interface) $this->_driver->destroy();
        $this->_driver=$linker->getDriver($key);
        $this->_queryHelper=null;
        return true;
    }
    /**
     * 获取活动连接参数
     * @return array
     */
    public function getActiveLink(){
        return $this->_activeLink;
    }
    /**
     * 获取活动连接键名
     * @return string|integer
     */
    public function getKeyOfActiveLink(){
        return $this->_activeKey;
    }
    /**
     * 生成一个新的模型对象
     * @param string $table 表名
     * @return \Monkey\Database\Model
     */
    public function newModel($table){
        return new Database\Model($table,$this);
    }
    /**
     * 获取当前数据驱动对象
     * @return \Monkey\Database\Driver\_Interface
     */
    public function &driver(){
        return $this->_driver;
    }
    /**
     * 获取Insert操作助手
     * @return \Monkey\Database\SqlHelper\Insert
     */
    public function &insert(){
        !$this->_insert and $this->_insert=new Database\SqlHelper\Insert();
        return $this->_insert->_reset($this->queryHelper());
    }
    /**
     * 获取Select操作助手
     * @return \Monkey\Database\SqlHelper\Select
     */
    public function &select(){
        !$this->_select and $this->_select=new Database\SqlHelper\Select();
        return $this->_select->_reset($this->_activeKey,$this->queryHelper());
    }
    /**
     * 获取Update操作助手
     * @return \Monkey\Database\SqlHelper\Update
     */
    public function &update(){
        !$this->_update and $this->_update=new Database\SqlHelper\Update();
        return $this->_update->_reset($this->queryHelper());
    }
    /**
     * 获取Delete操作助手
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function &delete(){
        !$this->_delete and $this->_delete=new Database\SqlHelper\Delete();
        return $this->_delete->_reset($this->queryHelper());
    }
    /**
     * 读取表字段信息
     * @param string $table 表名
     * @return boolean|array
     * 返回结果结构如下：
     * array(
     *      'pri_name'      =>string,
     *      'pri_is_auto'   =>boolean,
     *      'fields_default'=>array,
     *      'fields_type'   =>array,
     * );
     */
    public function getTableMate($table){
        return  $this->queryHelper()->getTableMate($table);
    }
    /**
     * 获取查询助手
     * @return \Monkey\Database\QueryHelper\_Interface
     */
    public function &queryHelper(){
        if(!$this->_queryHelper){
            $queryHelper='Monkey\\Database\\QueryHelper\\'.$this->_activeLink['protocol'];
            $this->_queryHelper=new $queryHelper();
        }
        return $this->_queryHelper->_reset($this->_driver);
    }
}